#include "tcp/MensajeroTCP.h"
#include "tcp/tcp.h"
#include "log.h"

MensajeroTCP::MensajeroTCP(int sockfd){
    this->sockfd = sockfd;
}

bool MensajeroTCP::enviarMensaje(const std::vector<char> &buffer){
    return MensajeroTCP::enviarMensajeA(this->sockfd, buffer);
}

bool MensajeroTCP::enviarMensaje(const char* buffer, unsigned size){
    std::vector<char> nuevo;
    nuevo.insert(nuevo.begin(), buffer, buffer+size);
    return enviarMensaje(nuevo);
}

bool MensajeroTCP::recibirMensaje(std::vector<char> &buffer){
    SobreTCP sobre;
    buffer.clear();
    do{
	if(!recibir(this->sockfd, &sobre, sizeof(SobreTCP)))
	    return false;

	log("Tamanio del sobre(recibir): %d.\n", sizeof(SobreTCP));
	buffer.insert(buffer.end(), sobre.datos, sobre.datos+sobre.tamanio);
    }while(sobre.mas_datos);

    return true;
}


bool MensajeroTCP::enviarMensajeA(int sockfd, const std::vector<char> &buffer){
    SobreTCP sobre;
    unsigned restante = buffer.size();
    unsigned inicio = 0;
    while(restante > 0){
	unsigned a_enviar=0;
	if(restante > MENSAJERO_DATA_SIZE)
	    a_enviar=MENSAJERO_DATA_SIZE;
	else
	    a_enviar = restante;

	memcpy(sobre.datos, &buffer[0]+inicio, a_enviar);
	sobre.mas_datos = (restante > a_enviar);
	sobre.tamanio = a_enviar;

	inicio += a_enviar;
	restante -= a_enviar;
	log("Tamanio del sobre (enviar): %d.\n", sizeof(SobreTCP));
	if(!enviar(sockfd, &sobre, sizeof(SobreTCP)))
	    return false;
    }
    
    return true;
}

bool MensajeroTCP::enviarMensajeA(int sockfd, const char* buffer, unsigned size){
    std::vector<char> nuevo;
    nuevo.insert(nuevo.begin(), buffer, buffer+size);
    return enviarMensajeA(sockfd, nuevo);
}
